package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

/*
// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
O_RDONLY int = syscall.O_RDONLY // 只读模式
O_WRONLY int = syscall.O_WRONLY //只写模式
O_RDWR   int = syscall.O_RDWR   // 读写混合模式
// The remaining values may be or'ed in to control behavior.
O_APPEND int = syscall.O_APPEND // 写模式的时候将数据附加到文件末尾
O_CREATE int = syscall.O_CREAT  // 文件如果不存在就新建
O_EXCL   int = syscall.O_EXCL   // 和 O_CREATE模式一起使用, 文件必须不存在
O_SYNC   int = syscall.O_SYNC   //打开文件用于同步 I/O.
O_TRUNC  int = syscall.O_TRUNC  // 打开文件时清空文件

OpenFile函数的第三个参数是文件的权限，跟linux文件权限一致：
r ——> 004
w ——> 002
x ——> 001
*/
func main() {
	write()
	read()
	creat()
}

func read()  {
	//以读写方式打开文件，如果不存在，则创建
	openFile, e := os.OpenFile("C:\\object\\码云库\\go_study\\base\\imput.dat", os.O_RDWR|os.O_CREATE, 777)
	if e != nil {
		fmt.Println(e)
	}
	buf := make([]byte,1024)
	for {
		len, _ := openFile.Read(buf)
		if len == 0 {
			break
		}
		fmt.Println(string(buf))
	}
	openFile.Close()
}

func write()  {
	openFile, e := os.OpenFile("C:\\object\\码云库\\go_study\\base\\imput.dat", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 777)
	if e != nil {
		fmt.Println(e)
	}
	str := "overwrite to file"
	openFile.WriteString(str)
	openFile.Close()
}

/*
创建写
*/
func creat() {
	f, err := os.Create("C:\\object\\码云库\\go_study\\base\\imputNew.dat")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	content := map[string]string{
		"hello": "111",
		"world": "222",
		"world1": "333",
		"world2": "444",
	}
	bw := bufio.NewWriter(f)
	for k, v := range content {
		bw.WriteString(k + ":" + v + "\n")
	}
	bw.Flush()
}

/*
Go还提供了一个io缓冲区：bufio,可以先将文件读取到缓冲区中，然后从缓冲区读取数据
*/
func bufio_r(){
	openFile, e := os.OpenFile("c:/1.txt", os.O_RDWR|os.O_CREATE, 777)
	if e != nil {
		fmt.Println(e)
	}
	reader := bufio.NewReader(openFile)
	//按行读取
	for {
		line, _, e := reader.ReadLine()
		if e == io.EOF {
			break
		}
		if e != nil {
			fmt.Println(e)
		}
		fmt.Println(string(line))
	}
	//按照指定分隔符读取
	for{
		s, e := reader.ReadString('\n')
		fmt.Println(s)
		if e == io.EOF {
			break
		}
		if e != nil {
			fmt.Println(e)
		}
	}
	openFile.Close()
}